package ocio.actions;


import java.util.Date;
import java.util.HashSet;
import java.util.Set;
import ocio.beans.Admin;
import ocio.beans.Cliente;
import ocio.beans.Oferta;
import ocio.beans.Reserva;
import ocio.beans.Subscripcion;
import ocio.services.AdminService;
import ocio.services.ClienteService;
import ocio.services.OfertaService;
import ocio.services.ReservaService;
import ocio.services.ServiceLocator;

import com.opensymphony.xwork2.ActionSupport;

/**
 * Clase destinataria de petición anulación de una reserva.
 * @author Esther García Galán
 * @author Rubén Gómez Vales
 * @version 1.0 13/05/2014
 * @see ocio.beans.Reserva
 */
public class AnularReservaAction extends ActionSupport {

	private static final long serialVersionUID = 1L;
	private int id;
	private int rol;
	private Set<Subscripcion> listaSubscripciones = new HashSet<Subscripcion>();
	private Set<Reserva> listaReservas = new HashSet<Reserva>();
	private Cliente cliente;
	private Admin admin;
	private Date fechahoy;
	

	  /**
		 * Método execute() de la clase ActionSupport de Struts 2. 
		 * Solicita los servicios para eliminar una reserva y posteriormente 
		 * actualiza el número de plazas disponibles de la oferta.
		 * @return un string que indica la respuesta de la acción ejecutada sobre la petición del usuario
		 */
	public String execute(){

		fechahoy=new Date();
		ServiceLocator serviceLocator = ServiceLocator.getServiceLocator();
		ReservaService reservaService = (ReservaService)serviceLocator.getService("Reserva");		
		Reserva reserva = (Reserva)reservaService.searchById(id);
		
		int numPlazas = reserva.getNumPlazas();
		int idOferta = reserva.getOferta().getId();
		
		// Puese ser cliente o admin el que esté anulando oferta
		// En cada caso se rellena información para la página de vuelta
		if (reserva.getCliente()!=null){
			rol = 2;
			int idUsuario = reserva.getCliente().getId();
			reservaService.delete(reserva);
			ClienteService clienteService = (ClienteService)serviceLocator.getService("Cliente");		
    		cliente = (Cliente)clienteService.searchById(idUsuario); 
    		listaReservas = cliente.getReservas();
    		listaSubscripciones = cliente.getSubscripciones();
		} else {
			rol = 1;
			int idUsuario = reserva.getAdmin().getId();
			reservaService.delete(reserva);
			AdminService adminService = (AdminService)serviceLocator.getService("Admin");		
    		admin = (Admin)adminService.searchById(idUsuario);
    		listaReservas = admin.getReservas();
    		listaSubscripciones = admin.getSubscripciones();
		}
		
		//Tras la anulación se actualiza el número de plazas reservadas en la oferta
		OfertaService ofertaService = (OfertaService)serviceLocator.getService("Oferta");
		Oferta oferta = (Oferta) ofertaService.searchById(idOferta);
		oferta.setPlazasReserv(oferta.getPlazasReserv()-numPlazas);
		ofertaService.update(oferta);
		
		return "success";
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public Set<Reserva> getListaReservas() {
		return listaReservas;
	}

	public void setListaReservas(Set<Reserva> listaReservas) {
		this.listaReservas = listaReservas;
	}

	public int getRol() {
		return rol;
	}

	public void setRol(int rol) {
		this.rol = rol;
	}

	public Set<Subscripcion> getListaSubscripciones() {
		return listaSubscripciones;
	}

	public void setListaSubscripciones(Set<Subscripcion> listaSubscripciones) {
		this.listaSubscripciones = listaSubscripciones;
	}

	public Admin getAdmin() {
		return admin;
	}

	public void setAdmin(Admin admin) {
		this.admin = admin;
	}

	public Date getFechahoy() {
		return fechahoy;
	}

	public void setFechahoy(Date fechahoy) {
		this.fechahoy = fechahoy;
	}
}
